﻿#include<iostream>
using namespace std;

// 差测试点6、7

int tr[1 << 20], pos[1 << 20];

int k, w;

int main()
{
	cin >> k;
	for (int i = k; i >= 1; i--)
		for (int j = 0; j < (1 << (i - 1)); j++) {
			cin >> tr[(1 << i) + 2 * j + 1];
			pos[(1 << i) + 2 * j + 1] = (1 << i) + 2 * j;
		}
	for (int i = k - 1; i >= 1; i--)
		for (int j = 0; j < (1 << (i - 1)); j++) {
			int up = (1 << i) + 2 * j + 1;
			int left = (up << 1) - 1;
			int right = up << 1 | 1;
			if (tr[up] < tr[left] && tr[up] < tr[right]) {
				cout << "No Solution" << endl;
				return 0;
			}
			else if (tr[up] >= tr[left]) {
				tr[pos[left]] = tr[up];
				pos[up] = pos[right];
			}
			else {
				tr[pos[right]] = tr[up];
				pos[up] = pos[left];
			}
		}
	cin >> w;
	if (w < tr[3]) {
		cout << "No Solution" << endl;
		return 0;
	}
	tr[pos[3]] = w;
	cout << tr[1 << k];
	for (int i = (1 << k) + 1; i < (1 << (k + 1)); i++)cout << " " << tr[i];
	return 0;
}

//差测试点0、6、7

//#include<iostream>
//#include<vector>
//#include<stack>
//#include<sstream>
//using namespace std;
//
//vector<int>arr[19], is_bigger[19];
//stack<string>input;
//int k, winner, flag, nosol;
//stringstream ss;
//
//void build(int round, int time)
//{
//	if (round > k || nosol || flag) {
//		flag = 1;
//		return;
//	}
//	int val;
//	ss >> val;
//	int last = arr[round - 1][time - 1];
//	if (last < val) {
//		nosol = 1;
//		return;
//	}
//	if (round == k) {
//		arr[round].push_back(last);
//		arr[round].push_back(val);
//	}
//	else {
//		if (is_bigger[round + 1][time - 1]) {
//			arr[round].push_back(last);
//			arr[round].push_back(val);
//		}
//		else {
//			arr[round].push_back(val);
//			arr[round].push_back(last);
//		}
//	}
//	if (time != (1 << (round - 1))) {
//		build(round, time + 1);
//	}
//	build(round + 1, 1);
//}
//
//int main()
//{
//	cin >> k;
//	cin.get();
//	for (int i = 0; i < k; i++) {
//		string s;
//		getline(cin, s);
//		input.push(s);
//	}
//	is_bigger[1].push_back(1);
//	int pos = 1;
//	while (!input.empty()) {
//		string s = input.top();
//		stringstream temp;
//		temp << s;
//		ss << s << endl;
//		int v1, v2;
//		while (temp >> v1 >> v2) {
//			if (v1 > v2)is_bigger[pos].push_back(1);
//			else is_bigger[pos].push_back(0);
//		}
//		input.pop();
//		pos++;
//	}
//	cin >> winner;
//	arr[0].push_back(winner);
//	build(1, 1);
//	if (!nosol) {
//		cout << arr[k][0];
//		for (int i = 1; i < (1 << k); i++)cout << " " << arr[k][i];
//	}
//	else cout << "No Solution";
//	return 0;
//}